// import Onionfy from './onionfy'
import axios from "axios";
import { activityEnd } from "./util.js";

let type = process.env.VUE_APP_API_ENV === "dev" ? "dev" : "production";
let url = {
  // TODO: undo this
  dev: "https://zhuanti.qa.chebada.com/activityapiv2/",
  // dev: "activityapiv2/",
  production: "https://zhuanti.chebada.com/activityapiv2/",
  t: "https://zhuanti.t.chebada.com/activityapi/Handler/",
  local: ""
};

const codeMessage = {
  200: "服务器成功返回请求的数据。",
  201: "新建或修改数据成功。",
  202: "一个请求已经进入后台排队（异步任务）。",
  204: "删除数据成功。",
  400: "发出的请求有错误，服务器没有进行新建或修改数据的操作。",
  401: "用户没有权限（令牌、用户名、密码错误）。",
  403: "用户得到授权，但是访问是被禁止的。",
  404: "发出的请求针对的是不存在的记录，服务器没有进行操作。",
  406: "请求的格式不可得。",
  410: "请求的资源被永久删除，且不会再得到的。",
  422: "当创建一个对象时，发生一个验证错误。",
  500: "服务器发生错误，请检查服务器。",
  502: "网关错误。",
  503: "服务不可用，服务器暂时过载或维护。",
  504: "网关超时。"
};

const request = axios.create({
  baseURL: url[type],
  timeout: 8000,
  headers: { "Content-Type": "application/x-www-form-urlencoded" }
});

/**
 * 响应拦截器
 */
request.interceptors.response.use(
  response => {
    if (response.config && response.config.manualRes) return;
    const data = response.data || {};
    const { header, body } = data;
    if (header.rspCode != 0) {
      if (header.rspCode == 44) {
        return activityEnd();
      }
      cbdztUtil.Toast.showToast(header.rspDesc, 2000);
      return Promise.reject(response);
    }
    return body || data;
  },
  error => {
    const { response } = error;
    if (response && response.status) {
      const errorText = codeMessage[response.status] || response.statusText;
      cbdztUtil.Toast.showToast(errorText, 2000);
    } else if (!response) {
      cbdztUtil.Toast.showToast("网络异常", 2000);
    }

    return Promise.reject(error);
  }
);

function sendRequest(url, params, config = {}) {
  const {
    serviceName,
    data,
    method,
    formateParam,
    formateRes,
    hideLoading
  } = params;

  let requestParam = {
    url,
    method: method || "post",
    data: formateParam
      ? formateParam(params)
      : {
          header: {
            serviceName
          },
          body: data || {}
        },
    ...config
  };
  return new Promise((resolve, reject) => {
    let isFinish = false;
    !hideLoading &&
      setTimeout(() => {
        if (!isFinish) cbdztUtil.Toast.showLoading();
      }, 100);
    request(requestParam)
      .then(res => {
        isFinish = true;
        cbdztUtil.Toast.hideLoading();
        resolve(formateRes ? formateRes(res) : res);
      })
      .catch(rej => {
        isFinish = true;
        cbdztUtil.Toast.hideLoading();
        reject(rej);
      });
  });
}

export default sendRequest;

//防止不同文件使用同一个实例
// let createSendRequest = () => {
//   //创建洋葱化promise，中间件可以链式调用，最后调用finish生成最终promise，单一中间件尽量功能单一
//   return new Onionfy(sendRequest).use(async (context, next) => {
//     // 中间件：加loading，200毫秒之内不显示loading
//     let isFinish = false;
//     setTimeout(() => {
//       if(!isFinish)cbdztUtil.Toast.showLoading();
//     }, 200);
//     try{
//       //向下执行
//       let result = await next();
//       isFinish = true;
//       cbdztUtil.Toast.hideLoading()
//       //继续执行
//       return Promise.resolve(result);
//     }catch(e){
//       if(e)cbdztUtil.Toast.showToast('接口调用失败，请重试', 2000);
//       isFinish = true;
//       cbdztUtil.Toast.hideLoading()
//       //中断执行
//       return Promise.reject(e)
//     }
//   })
// }
